{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 再次调整弱分类器数目n_estimators "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from xgboost import XGBClassifier\n",
    "import xgboost as xgb\n",
    "\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "from sklearn.metrics import log_loss\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# path to where the data lies\n",
    "dpath = './data/'\n",
    "train = pd.read_csv(dpath +\"RentListingInquries_FE_train.csv\")\n",
    "# train.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 准备数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train = train['interest_level']\n",
    "\n",
    "train = train.drop(['interest_level'], axis=1, inplace = False)\n",
    "X_train = train"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_split.py:2026: FutureWarning: From version 0.21, test_size will always complement train_size unless both are specified.\n",
      "  FutureWarning)\n"
     ]
    }
   ],
   "source": [
    "# 训练样本6w+，交叉验证太慢，用train_test_split估计模型性能\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train_part, X_val, y_train_part, y_val = train_test_split(X_train, y_train, train_size = 0.2,random_state = 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(9870, 227)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train_part.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "各类样本不均衡，交叉验证是采用StratifiedKFold，在每折采样时各类样本按比例采样"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# prepare cross validation\n",
    "kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "再次调整弱分类器数目"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def modelfit(alg, X_train, y_train, useTrainCV=True, cv_folds=None, early_stopping_rounds=100):\n",
    "    \n",
    "    if useTrainCV:\n",
    "        xgb_param = alg.get_xgb_params()\n",
    "        xgb_param['num_class'] = 9\n",
    "        \n",
    "        xgtrain = xgb.DMatrix(X_train, label = y_train)\n",
    "        \n",
    "        cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_params()['n_estimators'], folds =cv_folds,\n",
    "                         metrics='mlogloss', early_stopping_rounds=early_stopping_rounds)\n",
    "        \n",
    "        n_estimators = cvresult.shape[0]\n",
    "        alg.set_params(n_estimators = n_estimators)\n",
    "        \n",
    "        print (cvresult)\n",
    "        #result = pd.DataFrame(cvresult)   #cv缺省返回结果为DataFrame\n",
    "        #result.to_csv('my_preds.csv', index_label = 'n_estimators')\n",
    "        cvresult.to_csv('my_preds4_2_3_699.csv', index_label = 'n_estimators')\n",
    "        \n",
    "        # plot\n",
    "        test_means = cvresult['test-mlogloss-mean']\n",
    "        test_stds = cvresult['test-mlogloss-std'] \n",
    "        \n",
    "        train_means = cvresult['train-mlogloss-mean']\n",
    "        train_stds = cvresult['train-mlogloss-std'] \n",
    "\n",
    "        x_axis = range(0, n_estimators)\n",
    "        pyplot.errorbar(x_axis, test_means, yerr=test_stds ,label='Test')\n",
    "        pyplot.errorbar(x_axis, train_means, yerr=train_stds ,label='Train')\n",
    "        pyplot.title(\"XGBoost n_estimators vs Log Loss\")\n",
    "        pyplot.xlabel( 'n_estimators' )\n",
    "        pyplot.ylabel( 'Log Loss' )\n",
    "        pyplot.savefig( 'n_estimators4_2_3_699.png' )\n",
    "    \n",
    "    #Fit the algorithm on the data\n",
    "    alg.fit(X_train, y_train, eval_metric='mlogloss')\n",
    "        \n",
    "    #Predict training set:\n",
    "    train_predprob = alg.predict_proba(X_train)\n",
    "    logloss = log_loss(y_train, train_predprob)\n",
    "\n",
    "        \n",
    "    #Print model report:\n",
    "    print ('logloss of train :' )\n",
    "    print (logloss)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "     train-mlogloss-mean  train-mlogloss-std  test-mlogloss-mean  \\\n",
      "0               1.954303            0.001869            1.961597   \n",
      "1               1.777775            0.002509            1.792024   \n",
      "2               1.637797            0.004751            1.658035   \n",
      "3               1.523091            0.004554            1.548237   \n",
      "4               1.425891            0.005277            1.454989   \n",
      "5               1.341796            0.004756            1.375528   \n",
      "6               1.269345            0.005882            1.306226   \n",
      "7               1.203623            0.006282            1.245136   \n",
      "8               1.146978            0.006021            1.192566   \n",
      "9               1.095797            0.006319            1.144731   \n",
      "10              1.049504            0.005939            1.102781   \n",
      "11              1.008500            0.005431            1.064910   \n",
      "12              0.970954            0.005918            1.031250   \n",
      "13              0.937006            0.005852            1.000374   \n",
      "14              0.906382            0.005711            0.972425   \n",
      "15              0.877603            0.005473            0.946945   \n",
      "16              0.851514            0.005400            0.924094   \n",
      "17              0.827621            0.005420            0.903045   \n",
      "18              0.805718            0.005860            0.883477   \n",
      "19              0.785715            0.006157            0.866025   \n",
      "20              0.766902            0.005752            0.850334   \n",
      "21              0.749183            0.005904            0.835697   \n",
      "22              0.732734            0.006712            0.822437   \n",
      "23              0.718043            0.007020            0.809821   \n",
      "24              0.704025            0.007219            0.798431   \n",
      "25              0.691309            0.007604            0.787861   \n",
      "26              0.679427            0.007497            0.778032   \n",
      "27              0.668163            0.007555            0.768873   \n",
      "28              0.657706            0.007658            0.760368   \n",
      "29              0.647915            0.007595            0.752933   \n",
      "..                   ...                 ...                 ...   \n",
      "74              0.449894            0.005694            0.643128   \n",
      "75              0.448034            0.005928            0.642630   \n",
      "76              0.445694            0.005634            0.642137   \n",
      "77              0.443577            0.005843            0.641730   \n",
      "78              0.441188            0.005897            0.641302   \n",
      "79              0.438910            0.005792            0.640993   \n",
      "80              0.436613            0.005307            0.640833   \n",
      "81              0.434606            0.005321            0.640352   \n",
      "82              0.432559            0.005003            0.640068   \n",
      "83              0.430520            0.005175            0.639957   \n",
      "84              0.428580            0.005318            0.639730   \n",
      "85              0.426757            0.004858            0.639589   \n",
      "86              0.424995            0.004803            0.639385   \n",
      "87              0.423106            0.005127            0.639162   \n",
      "88              0.421580            0.005396            0.638902   \n",
      "89              0.419950            0.005624            0.638588   \n",
      "90              0.417927            0.005659            0.638354   \n",
      "91              0.416465            0.005223            0.637955   \n",
      "92              0.414838            0.005334            0.637723   \n",
      "93              0.413153            0.005157            0.637495   \n",
      "94              0.411259            0.004995            0.637396   \n",
      "95              0.409472            0.004839            0.637040   \n",
      "96              0.408080            0.005038            0.636942   \n",
      "97              0.406424            0.005145            0.636840   \n",
      "98              0.404559            0.004952            0.636735   \n",
      "99              0.403022            0.004707            0.636539   \n",
      "100             0.401565            0.004568            0.636452   \n",
      "101             0.399579            0.004414            0.636369   \n",
      "102             0.397938            0.004507            0.636353   \n",
      "103             0.396258            0.004503            0.636243   \n",
      "\n",
      "     test-mlogloss-std  \n",
      "0             0.001224  \n",
      "1             0.002396  \n",
      "2             0.001943  \n",
      "3             0.003275  \n",
      "4             0.002024  \n",
      "5             0.002870  \n",
      "6             0.003091  \n",
      "7             0.003672  \n",
      "8             0.003692  \n",
      "9             0.004060  \n",
      "10            0.004462  \n",
      "11            0.005269  \n",
      "12            0.005549  \n",
      "13            0.005989  \n",
      "14            0.006810  \n",
      "15            0.006935  \n",
      "16            0.007365  \n",
      "17            0.007804  \n",
      "18            0.008238  \n",
      "19            0.008861  \n",
      "20            0.009102  \n",
      "21            0.009526  \n",
      "22            0.009662  \n",
      "23            0.009784  \n",
      "24            0.009986  \n",
      "25            0.010085  \n",
      "26            0.010485  \n",
      "27            0.010478  \n",
      "28            0.010238  \n",
      "29            0.010595  \n",
      "..                 ...  \n",
      "74            0.011736  \n",
      "75            0.011736  \n",
      "76            0.011863  \n",
      "77            0.012076  \n",
      "78            0.011988  \n",
      "79            0.012232  \n",
      "80            0.012172  \n",
      "81            0.012049  \n",
      "82            0.011864  \n",
      "83            0.011818  \n",
      "84            0.011948  \n",
      "85            0.012049  \n",
      "86            0.012299  \n",
      "87            0.012312  \n",
      "88            0.012158  \n",
      "89            0.011934  \n",
      "90            0.012029  \n",
      "91            0.012056  \n",
      "92            0.012034  \n",
      "93            0.012457  \n",
      "94            0.012539  \n",
      "95            0.012323  \n",
      "96            0.012429  \n",
      "97            0.012499  \n",
      "98            0.012707  \n",
      "99            0.012942  \n",
      "100           0.012851  \n",
      "101           0.012758  \n",
      "102           0.012576  \n",
      "103           0.012793  \n",
      "\n",
      "[104 rows x 4 columns]\n",
      "logloss of train :\n",
      "0.44050411019807356\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEXCAYAAABCjVgAAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3Xd4FNf18PHv2V1VEBJFNInebMDYpuOKW4wdG/feGyaJS5w4iZ04iV//EqfYcUlcCcbEJTh23LCNW3DBhW46GExHNIkiQEKgsuf9447EIqshtBpJez7PMw+7M3dnzsyIPTv3ztwrqooxxhgDEPA7AGOMMQ2HJQVjjDFlLCkYY4wpY0nBGGNMGUsKxhhjylhSMMYYU8aSgjERROTXIjLe7ziM8YslhUZGRJqLyFoRuTJiXoqIrBeRiyPmDRaRd0Vkp4jkishSEfmjiLT0ll8vIiUikudNq0XkR1GOfaSIZEVzG4eionhU9UFVvTlK21srIqdHY93RUF/nq7Edl6bOkkIjo6p5wBjgcRFJ92b/FZijqv8FEJHjgM+Ar4AjVDUNGAUUA0dHrG66qjZX1ebAxcBfReTY+tkTcyhEJOR3DCZGqKpNjXACJgKTgJHAdqBDxLIvgX9U8/nrgS/LzZsFXBnxfjSwBMjFJZkjI5Yd6c3L9cqMjlh2NrAU2ANsBO4GmgEFQBjI86aOlezXk8B73udnAj1qcDyOAD4GdgDLgUtrEw9wP/CS97mugAI3ABuAncBYYAiw0Nv3JyK20wP4xDsf24CXgTRv2Yvetgq8bf2yBsd4LfArb1v7gZD3fqO3L8uB0yo4FsOBLUAwYt4FwELv9VBgDrAb2Ao8UskxHQlkVbIsFXgByAHWAfcBAW9ZEPibdwzWALd5xzFUybrWAqdXsuwWYKV3XieX/s0AAjwKZAO7vGPUv7Lz7ff/18Y0+R6ATbU8cdAS2Oz9x7shYn4zoAQYWc3nryciKXhfdLlAb+99byAfOAOIA37p/eeM996vBH7tvT/V+w/Yx/vsZuDEiDgHeq8r/ZKJiGOi9wUw1PsSfBl4pZrPNMN9ad/gfWagd1z6HWo8VJwUngESgR8A+4C3gLZAhveldLJXvqd3vBKAdGAa8FjEug/68qvqGEeUnw90ApKAPt5+doyIr8KECawCzoh4/xpwj/d6OnCN97o5MLySdVR6vnAJ4W0gxYtjBXCTt2ws7ks50zve/6MWScH7u9rmnc8E4B/ANG/ZmcBcIA2XII7E+2FU2fm2qWaTVR81Uqq6E/cLMxl4I2JRS1y14JbSGSLyV69dIV9E7osoO9ybn4e7SngR+M5bdhnwnqp+rKpFwMO4L6bjcL9EmwN/VtVCVf0EeBe4wvtsEdBXRFqo6k5V/eYQd+8NVZ2lqsW4pHBMNeXPAdaq6vOqWuxt73VclVhdxPN/qrpPVT/CfYlPUtVsVd0IfAEcC6CqK73jtV9Vc4BHgJOrWG9Vx7jU31V1g6oW4JJ9grcvcaq6VlVXVbLuSXjnQ0RScL+eJ0Ucj54i0kZV81R1xqEcDBEJerHfq6p7VHUt7srgGq/IpcDjqprl/Z3++VDWH+EqYIKqfqOq+4F7gREi0tXbhxTcFaKo6jJV3Ryxf4dzvmOaJYVGSkSuxv1C+x/wl4hFO3HVFB1KZ6jqL9W1K7yJ+yVdaoaqpqlrU2gP9AMe9JZ1xFULlK4jjPuVmuEt2+DNK7XOWwZwEe5LaJ2IfC4iIw5x97ZEvN6LS0BV6QIM8xJcrojk4r5Q2tdRPFsjXhdU8L45gIi0FZFXRGSjiOwGXgLaVLHeqo5xqQ0Ry1cCP8VdzWR72+pYybr/DVwoIgnAhcA3qlq6rZtwVynfishsETmnihgr0gZ3hbguYl7k+e8YGXe514ei/PHJw1XNZXg/RJ7AVTVuFZFxItLCK3q45zumWVJohESkLa4+9RbgVuBSETkJQFXzcfXwFx7KOlV1K+7X9bnerE24L9vSbQquGmOjt6yTiET+/XT2lqGqs1X1PFwVy1vAq6WbOZSYDsEG4HMvwZVOzVX1R/Ucz5+8dQ5Q1RbA1biqjVLlt1fVMa7wM6r6b1U9wfuccvAPgshyS3FfqGcBV+KSROmy71T1Ctzx+AvwXxFpVvPdZBvu13iXiHll5x9XfZMZsazTIaw7Uvnj0wxozYG/s7+r6iDcj5newC+8+ZWdb1MDlhQapyeAt1T1U++S+ZfAP71fhXjvbxSRe7wEgohkAt0qW6GItMY1Ri7xZr0K/FBEThOROODnuMbOr3FJJx/4pYjEichIXDJ5RUTiReQqEUn1qkR246o9wP3Cbi0iqXV0HEq9C/QWkWu8eOJEZIiIHFnP8aTgGpFzRSQD70sqwlage8T7qo7x94hIHxE51TvP+3BXKSUVlfX8G7gDOAnXplC6nqtFJN27Msn1Zle6HhFJjJxwV6KvAn/0bofuAvwMd2VUul93ikiGiKThGserE1duOyEv/htE5Bhvnx8EZqrqWu/8DvOOW753PEqqOd+mJvxu1LDp0CbgfNwvqLRy86cCf4x4PwyYgvtPnwssBv4ItPaWX4/7z1J65002rs65bcQ6LsA1GO4CPsdruPWW9fPm7fLKXODNjwc+wFVj7QZmAydEfG4Crgogl8rvPvpDxPuRVNM47ZXrg7tjKcdb/ye4tohDioeKG5pDEeWziGjEx30R3hdxTOZ6x3M+7ks+K6LsecB6b1t31+AYr+XghukBuLafPbjG+HcrOoYR5TvjvsDfKzf/Je985+F+BJxfyedHevtffuqJa7t6yTveG4DfceDuoxDuSnY77u6ju3BXFlLJdtZWsI0/eMvG4hrNS/c305t/Gu6OozwO3OnVvLrzbVP1k3gH2BhjokJEzgKeUdUu1RY2vrPqI2NMnRKRJBE5W0RCXjXa73E3OZhGwK4UTKMgIicC71e0TN3dU6aBEJFkXFXYEbh2j/eAO1V1t6+BmRqxpGCMMaaMVR8ZY4wp0+g62WrTpo127drV7zCMMaZRmTt37jZVTa+uXKNLCl27dmXOnDl+h2GMMY2KiKyrvlQUq49EpJOIfCoiy0RkiYjcWUEZEZG/i8hKEVkoIgOjFY8xxpjqRfNKoRj4uap+43XINVdEPlb3+H2ps4Be3jQMeNr71xhjjA+idqWgqpvV651QVfcAyzi4oy9wT3i+oM4MIE1EOmCMMcYX9XL3kdfV7bG4PnMiZXBwD4pZfD9xGGOMqSdRTwoi0hzX++ZPK3h4RSr4yPcenBCRMSIyR0Tm5OTkRCNMY4wxRDkpeD0Yvg68rKpvVFAki4O71c3EdfZ2EFUdp6qDVXVwenq1d1QZY4yppWjefSTAc8AyVX2kkmKTgWu9u5CGA7v0wOhJxhhj6lk07z46Hjc83yIRme/N+zWuO19U9Rlc185n48al3YsbYzcqduQXsjArl+HdW5MYF4zWZowxplGLWlJQ1S+puM0gsowCP4lWDJF+/NRk2u+cS4cf/ZQ+ndrVxyaNMabRiZm+j/4SepbH4p9i27plfodijDENVswkhVbn/wmA/K3f+RyJMcY0XDGTFFLa9wSgeNsanyMxxpiGK2aSAklp7JHmxO1e73ckxhjTYMVOUgB2xnckpSDL7zCMMabBiqmkUNC8E+2KN1NYHPY7FGOMaZBiKiloy65kSA4bd+T5HYoxxjRIMZUUEtO7Ey8lbM5a7XcoxhjTIMVUUkjN6AXA7k12W6oxxlQkppJCWsfeABTm2JWCMcZUJKaSgqRmUkKAQO5av0MxxpgGKaaSAsE4doTakZxvt6UaY0xFYispAHnJmbQq2kQ4/L2xfIwxJubFXFIoTu1CJtls2b3P71CMMabBibmkENemO21kN+u3bPU7FGOMaXBiLik09zrG25llt6UaY0x5MZcUWma421L3brXbUo0xprxojtE8QUSyRWRxJctTReQdEVkgIktEJGpDcUYKtu4KgO60LrSNMaa8aF4pTARGVbH8J8BSVT0aGAn8TUTioxiPk9SS/EBzEvZYF9rGGFNe1JKCqk4DdlRVBEgREQGae2WLoxVPpF0JGaTu24QbItoYY0wpP9sUngCOBDYBi4A7VbXCPq1FZIyIzBGROTk5OYe94f0pncjQLWzPLzzsdRljTFPiZ1I4E5gPdASOAZ4QkRYVFVTVcao6WFUHp6enH/aGQ627kyk5fLdl92GvyxhjmhI/k8INwBvqrATWAEfUx4ZTN39JghSTtdZuSzXGmEh+JoX1wGkAItIO6APUy32iKec/BEDexiX1sTljjGk0QtFasYhMwt1V1EZEsoDfA3EAqvoM8H/ARBFZBAjwK1XdFq14DoqtbV/3Iufb+ticMcY0GlFLCqp6RTXLNwE/iNb2q5TcirxQK1L3rCQcVgIB8SUMY4xpaGLuieZSeam96K4b2Jhb4HcoxhjTYMRsUgi0PZKespFvN9sdSMYYUypmk0KLLkfRXPaxad0Kv0MxxpgGI2aTQmKHfgDkZ1XYNZMxxsSkmE0KpPcBILR9uc+BGGNMwxG7SSG5FXlxrWm9dzX7i0v8jsYYYxqE2E0KQEFaL3pKFqtz8v0OxRhjGoSYTgqh9n3pJRtZvnmX36EYY0yDENNJIaXzUSTLfjavsz6QjDEGYjwphNq57i72b7I7kIwxBmI8KZDuOmWN32F3IBljDMR6UkhKI4dWtCtcx669RX5HY4wxvovtpEBpY3MWCzfm+h2KMcb4LuaTQnJmP3rKJuavq2o4aWOMiQ0xnxQS1kx1dyCtsQF3jDEm5pMCl0wEQDbNR1X9jcUYY3wWtaQgIhNEJFtEKr3fU0RGish8EVkiIp9HK5YqpR9JcSCB7kUryNppYysYY2JbNK8UJgKjKlsoImnAU8BoVe0HXBLFWCoXDLG/TX+OCqxm/gZrbDbGxLaoJQVVnQZU1Xp7JfCGqq73ymdHK5bqJHYdTH9Zy4L19TJEtDHGNFh+tin0BlqKyGciMldErq2soIiMEZE5IjInJyenzgMJZgwkWfazba092WyMiW1+JoUQMAj4IXAm8FsR6V1RQVUdp6qDVXVwenp63UfScSAAidkLKCoJ1/36jTGmkfAzKWQBH6hqvqpuA6YBR/sSSeueFIeS6aurWL5ljy8hGGNMQ+BnUngbOFFEQiKSDAwDlvkSSSBAcbujGRBYzTxrbDbGxLBo3pI6CZgO9BGRLBG5SUTGishYAFVdBnwALARmAeNV1bdK/YTOg+kbWMeidXXfZmGMMY1FKForVtUralDmIeChaMVwKCTjWOIpZvf6hcBgv8Mxxhhf2BPNpbzG5pa5i8ndW+hzMMYY4w9LCqVadqUoPo0BsppZa6xzPGNMbLKkUEqEYOaxHB1cw4zVlhSMMbHJkkKEwLbv6CPr+WbVRr9DMcYYX1hSiHTOowQJk5Q9z9oVjDExyZJCpM7DUISh8q1VIRljYpIlhUiJqWj7oxge+pYZq7f7HY0xxtQ7SwrlBLocz8DASuas2uJ3KMYYU+8sKZTXZQQJup/47IXsyLd2BWNMbLGkUF7n4wAYGviWWWusCskYE1ssKZTXPB1t3ZsRoeVMX2VJwRgTWywpVEC6HsfgwApmrbLO8YwxscWSQkW6HE8zzUdylrJ19z6/ozHGmHpjSaEiXQ60K3z6rW9DRxtjTL2zpFCR1Ew0rTMnJ3zHVEsKxpgYYkmhElJUwJDwAr78Lod9RSV+h2OMMfUimiOvTRCRbBGpcjQ1ERkiIiUicnG0YqmVxDSas5euxWuYaV1pG2NiRDSvFCYCo6oqICJB4C/Ah1GMo3aufxeA0+MW8cmyrT4HY4wx9SNqSUFVpwHV/cS+HXgdaHgV9yntoV1/zk5eytRvs1FVvyMyxpio861NQUQygAuAZ2pQdoyIzBGROTk59fjsQM/T6L1/MTt27mRldl79bdcYY3ziZ0PzY8CvVLXaVlxVHaeqg1V1cHp6ej2E5ulxGkEtZkRgid2FZIyJCX4mhcHAKyKyFrgYeEpEzvcxnu/rPBzimnFByrd8ssySgjGm6fMtKahqN1Xtqqpdgf8CP1bVt/yKp0KhBOh2IscUzmXW2h3k7Nnvd0TGGBNV0bwldRIwHegjIlkicpOIjBWRsdHaZlT0PJ1M3UIX2cIHizf7HY0xxkRVKForVtUrDqHs9dGK47D1OBWAi1KX887Cvlwzoqu/8RhjTBTZE83Vad0DWnbjnKQlzF67wzrIM8Y0aZYUaqJ4H11zpxOvhUxZZFVIxpimq9qkICI9RCTBez1SRO4QkbToh9aAnP80AS3hylYreHehJQVjTNNVkyuF14ESEekJPAd0A/4d1agamq4nQFJLLms+j7nrdrIpt8DviIwxJipqkhTCqlqMe/r4MVW9C+gQ3bAamGAc9PkhvXO/Io5i3rOrBWNME1WTpFAkIlcA1wHvevPiohdSA9V3NIHC3VyZvpp3Fm7yOxpjjImKmiSFG4ARwB9VdY2IdANeim5YDVD3kZDQgitT5rMwaxffbd3jd0TGGFPnqk0KqrpUVe9Q1Uki0hJIUdU/10NsDUsoAXqfSa+d00gIhHl1zga/IzLGmDpXk7uPPhORFiLSClgAPC8ij0Q/tAboyNEECnYwtstm3vhmI4XFYb8jMsaYOlWT6qNUVd0NXAg8r6qDgNOjG1YD1fN0iEvmkmbz2J5fyCfWc6oxpompSVIIiUgH4FIONDTHpvhkiEsiY/VrtG8e4jWrQjLGNDE1SQoP4IbLXKWqs0WkO/BddMNqwH74CBIu4q6eW/h0ebZ1e2GMaVJq0tD8mqoOUNUfee9Xq+pF0Q+tgeo9ChJacLZ+QVjh9W+y/I7IGGPqTE0amjNF5E0RyRaRrSLyuohk1kdwDVJcIvQdTcqa90lPKOHx/31HSdjGbzbGNA01qT56HpgMdAQygHe8ebFrwGVQmMezQ7eyvzjM1GVb/Y7IGGPqRE2SQrqqPq+qxd40EajHgZIboC4nQEpHjsn9mIy0JMZ/scbviIwxpk7UJClsE5GrRSToTVcD26v7kIhM8KqcFley/CoRWehNX4vI0YcavG8CATjqYgKrpjJ2SCqz1u5gwYZcv6MyxpjDVpOkcCPudtQtwGbgYlzXF9WZCIyqYvka4GRVHQD8HzCuButsOAZcCuFiLkmaQ0pCiOe+tKsFY0zjV5O7j9ar6mhVTVfVtqp6Pu5Btuo+Nw3YUcXyr1V1p/d2BtC4Gq/b9Ye4ZBI/+z8uH9qJ9xZtZqN1qW2MaeRqO/Laz+o0CrgJeL+yhSIyRkTmiMicnJycOt50LYlA83ZQuIebe+UDMPEru1owxjRutU0KUlcBiMgpuKTwq8rKqOo4VR2sqoPT0xtQG/ctn0AokXbLXyYtKY7nvlxD7t5Cv6Myxphaq21SqJMb80VkADAeOE9Vq228bnCSW0H/i2Hhq0y69kjCChO+Wut3VMYYU2uVJgUR2SMiuyuY9uCeWTgsItIZeAO4RlVXHO76fDPkJijKp/eWKYzq157nv1rDroIiv6MyxphaqTQpqGqKqraoYEpR1VB1KxaRScB0oI+IZInITSIyVkTGekV+B7QGnhKR+SIyp072qL5lDISOA2H2eG4/tQd79hXzr6/X+h2VMcbUSrVf7rWlqldUs/xm4OZobb9eDb0F3voR/QoXcvqRbXnuyzXceEI3midE7fAaY0xU1LZNwUTqdwEEQvDa9dx+ai92FRTxwvS1fkdljDGHzJJCXYhLgubtYe92jm62k7SkOP720Qq7E8kY0+hYUqgrN/8PAnEw/UleuXU4qsrfp670OypjjDkkNek6u6K7kDZ43Wl3r48gG4UWHVzvqfNe4oiUIi4b0okXZ6xlzbZ8vyMzxpgaq8mVwiPAL3DdZmcCdwP/BF4BJkQvtEbouNuhuABmj+euM3oTHwzw5/eX+R2VMcbUWE2SwihVfVZV96jqblUdB5ytqv8BWkY5vsal7RFuZLZZz9I2IczYk3vw4ZKtzFzd+J7LM8bEppokhbCIXCoiAW+6NGKZDTlW3nF3wN7tsODf3Hxid+KDAW6YOJvikrDfkRljTLVqkhSuAq4Bsr3pGuBqEUkCbotibI1Tl+MgPgU++DVJgRIeu/wY9haW8K/p6/yOzBhjqlWTrrNXq+q5qtrGm85V1ZWqWqCqX9ZHkI2KCFw8AUr2w4J/c1b/9pzSJ51HPlrO5l3WtbYxpmGryd1Hmd6dRtkislVEXheRxjX2QX3rdQZkDIZpDyMlhTxwXn9KVLl/8hK/IzPGmCrVpProeWAyrhO8DOAdb56pjAic8mvYtQHmvUinVsnccVovPlyylY+XbvU7OmOMqVRNkkK6qj6vqsXeNBFoQIMaNFA9ToVOw2Ha36BoH7ec2J2kuCA/fnkuO/PtSWdjTMNUk6SwTUSuFpGgN10N2D2W1Sm9WtizCeZOJC4Y4LWxIwD4zVuLULUbt4wxDU9NksKNwKXAFmAzcDFwQzSDajK6nQQJqfDRb6Agl/4Zqdx1Rm+mLNrCm/M2+h2dMcZ8T03uPlqvqqNVNV1V26rq+cCF9RBb4ycC178D4RKY9hAAt57Ug6FdW/H7t5eQtXOvzwEaY8zBatsh3s/qNIqmrMPRcOzVMPNZ2L6KYED426VHk19YzKjHvqDIHmozxjQgtU0KUm0BkQnebayLK1kuIvJ3EVkpIgtFZGAtY2n4Tv0thBLho/sA6NQqmccvP5a8/cU89OFyn4MzxpgDapsUatJKOhEYVcXys4Be3jQGeLqWsTR8Ke3gpJ/D8imw6lMAzj26I9cM78K4aav5aMkWnwM0xhin0qRQSZfZu0VkD+6ZhSqp6jRgRxVFzgNeUGcGkCYiHQ55DxqL4T92VwuTroDi/QDcd86RHJWRys9fW8D67da+YIzxX6VJQVVTVLVFBVOKqtbF4MMZwIaI91nevO8RkTEiMkdE5uTk5NTBpn0QSoDLXnJda3/1OAAJoSBPXTWQvYUlnPnYNPL2F/scpDEm1vk58lpF7RIVVkup6jhVHayqg9PTG/Fzc73OgH4XwrSHYZsbla1Tq2Qm3jCEwpIwd06aR0nYnl8wxvjHz6SQBXSKeJ8JbPIplvoz6k+uGum9u8B7gO3EXuncf25fpn6bzZ+m2KA8xhj/+JkUJgPXenchDQd2qepmH+OpHynt4fTfw5pp8MSQstnXjOjK9cd1ZfyXaxj50Kc+BmiMiWVRSwoiMgmYDvQRkSwRuUlExorIWK/IFGA1sBI3vOePoxVLgzPoBkhIgZ2rYdeBJ5vv++GRpCXFsXb7XqYsavr50RjT8Ehj64Nn8ODBOmfOHL/DOHzbV8EzJ0KnIXD1mxBw+bmgsIRrnpvJwqxdTLh+CCf0auNzoMaYpkBE5qrq4OrK+Vl9FNta94Az/wCrP4PZ/yybnRQf5LnrhtA9vRnXTpjJ2Y9/4V+MxpiYY0nBT4NugF4/gI9/BzkrymanJsfxwo1DiQsG+HbLbuasrepxD2OMqTuWFPwkAqP/AeFiGDcSig4M19m2RSKf/+IUurZuxrUTZjF9lfVWboyJPksKfktpD1e8AkV7YcrdBy1qn5rIK7cOJyMtiavGz+DMRz/3KUhjTKywpNAQ9DoDTvoFzHsJvnnxoEVtUxJ5ZcxwEuOCrNiaxxvfZPkUpDEmFlhSaChG3gPdTnZXC5sXHrSodfMEZv76NI7r2ZqfvbqApz9bZSO3GWOiwpJCQxEIwkXPgYZh/OmQv+2gxSmJcTx//VBGH92Rv3zwLcMenGpjMRhj6pwlhYakeTrc+IF7/ep1UFJ00OL4UIDHLjuGDqmJZO/Zz3UTZpG7t9CHQI0xTZUlhYYmYxCc9wSs+xLe/9X3FgcCwvR7T+ORS49mztqdDHtwKuf+w55lMMbUDUsKDdGAS+G4O2DOc/D3YysscuHATCaNGUZYlSWbdvOf2eutncEYc9gsKTRUp98PSa1gx2pYOrnCIoO6tOKre05lRI/W/Or1RQz+w/+46Omv6jVMY0zTYkmhoQoE4a4lkDkUXr8Z1n5ZYbG2KYm8cOMw7v5Bb7bnF7Ioazefr2ikAxEZY3xnHeI1dHt3wIRRsH0ltD8Kbq38AbZ563dy92sLWJWTT3rzBDq3SuL1Hx9fj8EaYxoq6xCvqUhuBVe/7q4cti6G7MoH4Tm2c0veu+NEbj25Ozl5+1m4cRfvLNhkbQ3GmBqzpNAYpHWCH8+A5Dbwr9EHdZ5XXmJckHvPOpJ3bjuBI9q34PZJ8zjmgY9ZlZNXjwEbYxorSwqNResecN077vUzx8O4U6osflRmKm/95Hi6tEpmz74iznx0GvdPXmLPNRhjqhTVpCAio0RkuYisFJF7KljeWUQ+FZF5IrJQRM6OZjyNXnpvlxhUYcsi2DS/yuLBgPD5L09h1m9O59IhnZj49VoG/eF/jJu2in1FJfUUtDGmMYlaQ7OIBIEVwBlAFjAbuEJVl0aUGQfMU9WnRaQvMEVVu1a13phraK7ItpXw4vmwb5frYbVrzRqTz/3HF6zfUcCugiLigwEyWibx0V0nERe0C0ZjmrqG0NA8FFipqqtVtRB4BTivXBkFWnivU4FNUYyn6WjTE2780HW7/a9z4MnhNfrYO7efyILf/4BJtwwnLiSs2ZbPqX/7jH/PXM/+YrtyMMZENylkABsi3md58yLdD1wtIlnAFOD2KMbTtKRmwA3vQ1wy5CyDr//hqpVqYESP1vTr0ILe7ZrTqlkCv35zEf1//yHPfL6KXQVF1a/AGNNkRbP66BLgTFW92Xt/DTBUVW+PKPMzL4a/icgI4Dmgv6qGy61rDDAGoHPnzoPWrVsXlZgbpaICeHMsLH0LBl0PZz8Mwbgaf1xVOevxL9iUW8DufcUEBNqmJDBpzAi6tWkWvbiNMfWqptVH0UwKI4D7VfVM7/29AKr6p4gyS4BRqrrBe78aGK6q2ZWt19oUKhAOw6d/gC/+Bgkt4PZvXI+rh2jxxl1cN2EWO/ILUSA1KY52LRKYcseJhKzdwZhGrSEkhRCuofk0YCOuoflKVV0SUeZ94D+qOlFEjgSmAhlaRVCWFKqw8FWYfLt7nuGyFyFjYK1Wk717H5NmbeCJT7+jqERp1yKBoAjpKQm8fdsJdRxCfxHrAAAX8klEQVS0MaY++J4UvCDOBh4DgsAEVf2jiDwAzFHVyd4dR/8EmuManX+pqh9VtU5LCtXYNB/+czXsyoJWPeD2OSBSq1Vd8szX5O4tolOrZD751l28DerSku15+2ndLN660DCmEWkQSSEaLCnUQP42+Mcg2JcLAy6DHz4CCc0Pa5UXPPkV2/L2kxTvxooGOL5na7J2FtAqOZ43f2IJwpiGzJJCrAuXwLSH4bMHIZQEN30EHQYc9mpVlXP/8SU78gtJig+yKicfgAGZqezIKyQtOY53bj8BqeXViTEmOiwpGOep42H7clc5d+p9cNztrnO9OjL6H1+yc28h6SkJfLM+F4D2LRIpUSUtKY7//ug4UpNqfjeUMSY6LCmYA/K3w7t3wrJ33N1JYz5zfSnVsQuf+orcvUX0aZ/Ch0u2EFbX1UZSXJDUpBAPXXw0j368gkBA+M+tI+p8+8aYyllSMAdThSeGuJHcAiE46Rdw/J0Qio/K5i555mvy9hVzet92TPhqDfn73RPTAjRLCHHVsM588m02KYkh3rAGa2OizpKCqdjuzfDBPe5ht7gkuPJV6HZSVDd52bPTKQ4rt53Sk1+/uYg9+4opLA5TWOKeUcxsmURBYQnNEoL89eKjeejD5YTsasKYOmVJwVTtyRGwYxWU7Id+F8IP/uC6zqgn+4pKuPCpr8jbX8xRGWl8vHRrWZIASAwFOK1vOxZuyCU5PsTLtwzjJy9/A2DJwphasKRgqldUAF89Dp//xb0/8W44/g5ISKn3UC57djpFJWFuP60Xv31zMfmFxTRLCJG1s6CsTFxQSI4PcfnQTvxv6VaS4oK8cusIbpo4G7BkYUxVLCmYmht3GuSuhb3bIBAHqZ3gJzMglOB3ZFz01FfkF5Zw8aBMnv5sFQVFJRSVhCkqOfB3GxcUEkNBzuzfnhmrt5MYCvD4Fcfy+7eXELRqKGMASwqmNjbOhRcugP27oEUGnPhzOPaaqDVG11ZRSZgLn/qKfUVhLhiYwYQv17C/KExyQpCtu/cfVDYUEOJDAeKDAUYf05HPlmeTEAry8CVHc//kJcQFhVfHHufTnhhTfywpmNpRhdWfwacPQtYsCCa49oaB17iG6Qbu4qe/Zl9RCT8+pScPTllW1qBdWBwmGBD27Cs+qLwAHdOS2FVQSFwwwDkDOvLpt9nEBYX7zunLox+vIC4Y4LWxI7hq/EzAqqlM42RJwRweVXj6eNi1HvbvcdVKLTLg1s8hKc3v6A7JZc9OB9yX+UVPfcX+4jB3nt6bP7y3lMLiMCN6tOZ/XkN3YlyQ3L3fH1NCBIIixAUDDOrSkmWbdxMXFK4a1oXXv8kiFAzwh/P78+B7ywgFXZXV1ZZETANiScHUDVVY+6XrZG9fLsQ1c1cNw26FVt39jq7ORCaOS575mqKSMPeP7s8vXltAUUmY847JYNKs9RSVhOnaphlLN+2mqCRMuIr/PgGBUCBA9/RmbMwtIBQQzujbji++20ZQhBtO6MZLM9YRDAj3n9uPP7+/jGBA+NeNQxnzwhxErD3E1B1LCqbubV4A05+Chf8BFHr9AIbcAj1Pq9OuMxqD0iTywk1DufzZGRSHw9xz1pH87u3FFJcoFw3K5N8z11EcVo7t3JIZq7dTXKKkJsWRvWdflcmklBvwKJHcgkKCAeHYTi1ZsmkXwYAwqn97pi7LJiBwzYiuTJq1noDAnaf15slPVxIQeOC8/jzw7lICAgERRGDC9S7hBAReHXvcQcnQNG2WFEz0/PN0yNsCJYWQt9XdpXTyPa5RuhaD+8SCyC/fy56dTliV8dcO4brnZ1ISVn57Tj/ue3MRxWHlquFdmPDlakrCykm90/nf0q2UKPRIb8ayzXsIq9IsIUTu3sIaJZfKJIQCFIeVgECH1CRy9uxHBPp2aMGKrXsIBIQR3Vsza80OROCMvu345NtsBOHiQZm8NW8jInDNiC68NGM9AtxyUnee+3INAtx1Rm/+PvU7ROA3P+zLn6YsQwT+eMFR/PatxQjwyGXHcPdrCxDgqasHcZv3LMq4awdz64tzEOCFm4Zx/fOzEO/4XT5uxkHHsjavS1VVtqmxpGCir7gQnjkB9mxxdywhkNwaLn0BuhxX63EcTM1c9ux0VJV/3TiMq8bPIKzKI5cewx2T5hFW5Tc/7Mv/m7yEMK5327DC9cd1ZfwXqwmrcs6Ajrw1fyPhsHJ8zzZ8viIHVejbsQULs3YRViWzZRLrt+8ljBuJb0d+IaXfGYeTkOpCXFAoLlEQSIoLsq+oBBGhWXyQvYWuW5W05LiyccfTmyewPb8QOPCn2aVVMzbs3AtAr7bNWZWTBwj9OrZg2ebdiAjHdk5j/vpcRGBot1bMXrMDRBjRozXTV21HgJP7pPPFihxAOL1vW6Yuc+OPnNG3HR8v3YoAo/q354MlWxDgnAEdeW/RZgBGH9ORyfM3AXDBsRm8NW8jABcOzOSNb7IAuGiQe52SGMcHP61dDwSWFEz9ylkOL5wHedmgJRCXDM3bw80fQ7M2fkdnDlFNfnVf+szXhBUm3jiU6ybMRBWeuXoQY16cgyo8fMnR3PWf+SjwwHn9uO/NxShwz1lH8OCUZajCnaf34tGPV6AKY0/uwdOfrUSBm07szvgvVoPClcM68+KMdaDuy/G1uRtA4fxjM3jT+wI9Z0AH3lngvlhH9e/A+4s2o7gv5Y+WbgV1X9yfLc+m9CtPgaFdWzFjzXZQOLpTGvPW7wTgyA4tWLJpN4rSI705K7PdGCKdWiazfsdeFKVjWhKbcgtQhfSUBLJ370dR0pLjyd1biKpLpKVJqVlCiLz9xaCQGBegoKgEBeKCAYqK3dP8wYBQ7GXbYEAo8V6LuOa9DqmJTL/3tFqdU0sKxh+F+bD4dfjgXijMc53vJaRAs7Zwy1RfnpY2pjZqWzVVH69ro0EkBREZBTyOG45zvKr+uYIylwL34xL3AlW9sqp1WlJoRLYuhYWvwIynXftDKNFdQSS3cQkisYXfERoTM3xPCiISBFYAZwBZwGzgClVdGlGmF/AqcKqq7hSRtqqaXdV6LSk0QuES2DDL9cw6Z4JLEMF4iG/u2iBu+giSW/kdpTFNWk2TQiiKMQwFVqrqai+gV4DzgKURZW4BnlTVnQDVJQTTSAWC0GWEm878E2TNdgli9ngo2AEP9fQSRCu49m1o2cXviI2JWdFMChnAhoj3WcCwcmV6A4jIV7gqpvtV9YPyKxKRMcAYgM6dO0clWFNPAgHoPMxNZz4Im+bBt+/BjKdg5xp4fIB7QC65FVw0HjIGQzCaf6bGmEjR/N9W0f2I5euqQkAvYCSQCXwhIv1VNfegD6mOA8aBqz6q+1CNL0QgY6CbTvstbF8Fy6fA53+FXRtgwpnuKiMxDU75DfQ4BVp2s1tdjYmiaCaFLKBTxPtMYFMFZWaoahGwRkSW45LE7CjGZRqq1j3guNvdVLATVn8OU37putd472euTDAejhztnoPoPALSj3BXH8aYOhHNpDAb6CUi3YCNwOVA+TuL3gKuACaKSBtcddLqKMZkGoukltDvfDepuquI1Z/Cuq9dX0yL/3ugHAIJLeDiCdBhAATjfA3dmMYsaklBVYtF5DbgQ1x7wQRVXSIiDwBzVHWyt+wHIrIUKAF+oarboxWTaaREoE1PNw29xSWJHath/XRYN90liIIdMP5UkADEp8CQGyFziJuat/V7D4xpNOzhNdM07NniksQH97quvov3QdgbOyGU6B6aG3kPZA6Ftn2t8drEHN+fU4gWSwqmRooKXK+uG2bBl4/B/t0Q9sZJkKBrk8gYBJmDocMxkJppDdimSbOkYEwkVchdBy9f4q4kUjq422FLb4gLhNyzEgOvhXb9oV0/aNO7wQ1FakxtNYSH14xpOESgZVe4LeLGtqJ9sHWxSw6fP+T6apr5jHviGtxoc8F4iG8GJ9wF7Y+C9v29xm1jmia7UjAmUkmRu9Np62LYsgjm/ssli3DEEJ3N2kLxfjdm9Ul3uzaK9CPcA3dWBWUaKKs+MqYu7dnqksTWxbD9O1j6NhTudd2El0pMc43bcUluRLrWPdzUqod1/md8Z0nBmGhThd2bIGeZG09i+yp3e2zRPijZf3DZQJxLFn1HQ+te0KobpHaCtM6uU0C7wjBRZknBGD8V7nV9OW1f5Z6pmPGUuyMqlAj55fp9lAC06eOGOA0lwok/h1bdDyQOexjP1AFLCsY0VAW57k6o3A3w0X2ufSJjIKz6FIoLQMMHykrAXWWEEqDPWbD2K5c4znnENZy36GhJw9SIJQVjGiNV9yDejlWwc62b5k50iSMxzXUUWL5fyZQO7jbbUAIcdSksf9+9PvdxlzRSOtittcaSgjFNUrgEdm90yWLHGvd690ZY9q5rx5Cgu1uqvECcSwxdT3K34Abj4cSfuS5AmreDFhnuX+tcsMmypGBMrNq3yzWA797o/bsZ5jznnr9okekaxku7ADmIuMSROdQ1nIcSvMTR3iWM5m3dFEqo910yh88eXjMmViWmuqntkQfmjfzVwWWKCyE/xzV679kKu7Pgi0ddNVVJoeuuvKQQ3r3r++sPBKFVT1fNFYyHYy6HlI6Q0v5AdVVKe0sejZQlBWNiUSgeUjPcVGrIzQeXKSmCvGx3V1RetpumPewe5EvvA3s2uT6lZo77/i244HqrDRdCIB66n+wSRfN20Czdu+po781ra43lDYglBWNMxYJx308cg677fjlVNyjSns2uqmrPJsjbCnt3wKLXDjwlvuKDSqqtcG0e6UfAriy33YHXeNVW6S6JlE6JadbuEWWWFIwxh0fEdfGR3Mp1JBhp1J8Ofl+831Vb5WW7xLFnC3zxN1dVlZrhnu0oync920Y+LV4qEDpwm26noe4J80AcDL0ZkttAszbuYcAkL57ENOsm/RDZ0TLG1J9QguumPDXzwLzBN3y/XLgE9m732j1yIC8H9m5zyWTey64Ka/8e2Od1iT71gcq3GQi6xNF+AGxf6RJL/4sgKc11blg6NWvjrkaS20BcYt3veyMR1aQgIqOAx3Ejr41X1T9XUu5i4DVgiKrarUXGxLpA8MDdTuWd/vvvzysqgPxtLpHs3e6qrgp2uH/L5m33Bl8qgVnjKr4SKRVKdMsl5IZ43bbCJZajLj6QRJJbf//KpAk0rkctKYhIEHgSOAPIAmaLyGRVXVquXApwBzAzWrEYY5q4uCRI6+SmmiopdrfvFuz0ksY278pkm2tAX/AfdxUSSnTVW4V74ZsXoXBP5euUgGtM35frrki6HO8lkVbQrLWXQFq6aq2ktAN3iiW0cImwAYjmlcJQYKWqrgYQkVeA84Cl5cr9H/BX4O4oxmKMMQcLhtwXdbPWQM/vLz+jkiqpkqKIK5BtB65M9u5wyWDfLlg+xTWq797kui8JFx3cfUlFAiHXdUletnt9xNkHV28ltYS2/SC99+HueZWimRQygA0R77OAYZEFRORYoJOqvisilSYFERkDjAHo3LlzFEI1xpgaCsZBSjs3HYqiApdACnZ6VyheAtm3yyWTgp3uSmXlJ66aa+Un7nbgyGTSIhN+tqRu96ecaCaFivoCLnt8WkQCwKPA9dWtSFXHAePAPdFcR/EZY0z9iUv6fiN7TRQVuARSsMNVNUVZNJNCFhBZwZcJbIp4nwL0Bz4T15d8e2CyiIy2xmZjjPHEJbmpRYd62Vw0nwKZDfQSkW4iEg9cDkwuXaiqu1S1jap2VdWuwAzAEoIxxvgoaklBVYuB24APgWXAq6q6REQeEJHR0dquMcaY2ovqcwqqOgWYUm7e7yopOzKasRhjjKmedSJijDGmjCUFY4wxZSwpGGOMKWNJwRhjTBlLCsYYY8o0ujGaRSQHWFfLj7cBttVhOA1dLO2v7WvTZPtad7qoanp1hRpdUjgcIjKnJgNXNxWxtL+2r02T7Wv9s+ojY4wxZSwpGGOMKRNrSWGc3wHUs1jaX9vXpsn2tZ7FVJuCMcaYqsXalYIxxpgqWFIwxhhTJmaSgoiMEpHlIrJSRO7xO566JCKdRORTEVkmIktE5E5vfisR+VhEvvP+bel3rHVFRIIiMk9E3vXedxORmd6+/scbw6PRE5E0EfmviHzrnd8RTfW8ishd3t/vYhGZJCKJTem8isgEEckWkcUR8yo8l+L83fu+WigiA+srzphICiISBJ4EzgL6AleISF9/o6pTxcDPVfVIYDjwE2//7gGmqmovYKr3vqm4EzdOR6m/AI96+7oTuMmXqOre48AHqnoEcDRun5vceRWRDOAOYLCq9geCuIG5mtJ5nQiMKjevsnN5FtDLm8YAT9dTjLGRFIChwEpVXa2qhcArwHk+x1RnVHWzqn7jvd6D++LIwO3jv7xi/wLO9yfCuiUimcAPgfHeewFOBf7rFWkS+yoiLYCTgOcAVLVQVXNpoucVN75LkoiEgGRgM03ovKrqNGBHudmVncvzgBfUmQGkiUi9jMcZK0khA9gQ8T7Lm9fkiEhX4FhgJtBOVTeDSxxAW/8iq1OPAb8Ewt771kCuN9ofNJ3z2x3IAZ73qsrGi0gzmuB5VdWNwMPAelwy2AXMpWme10iVnUvfvrNiJSlIBfOa3L24ItIceB34qaru9jueaBCRc4BsVZ0bObuCok3h/IaAgcDTqnoskE8TqCqqiFeXfh7QDegINMNVoZTXFM5rTfj2Nx0rSSEL6BTxPhPY5FMsUSEicbiE8LKqvuHN3lp6yen9m+1XfHXoeGC0iKzFVQOeirtySPOqHaDpnN8sIEtVZ3rv/4tLEk3xvJ4OrFHVHFUtAt4AjqNpntdIlZ1L376zYiUpzAZ6eXcyxOMasCb7HFOd8erUnwOWqeojEYsmA9d5r68D3q7v2Oqaqt6rqpmq2hV3Hj9R1auAT4GLvWJNZV+3ABtEpI836zRgKU3wvOKqjYaLSLL391y6r03uvJZT2bmcDFzr3YU0HNhVWs0UbTHzRLOInI37RRkEJqjqH30Oqc6IyAnAF8AiDtSz/xrXrvAq0Bn3n+4SVS3f0NVoichI4G5VPUdEuuOuHFoB84CrVXW/n/HVBRE5BtegHg+sBm7A/ZhrcudVRP4fcBnubrp5wM24evQmcV5FZBIwEtdF9lbg98BbVHAuvcT4BO5upb3ADao6p17ijJWkYIwxpnqxUn1kjDGmBiwpGGOMKWNJwRhjTBlLCsYYY8pYUjDGGFPGkoIxxpgylhSMqQEROcZ71qX0/ei66oJdRH4qIsl1sS5jDpc9p2BMDYjI9bhunW+LwrrXeuvedgifCapqSV3HYoxdKZgmRUS6eoPR/NMbsOUjEUmqpGwPEflAROaKyBcicoQ3/xJvoJcFIjLN6xrlAeAyEZkvIpeJyPUi8oRXfqKIPC1uoKPVInKyN6DKMhGZGLG9p0VkjhfX//Pm3YHrAO5TEfnUm3eFiCzyYvhLxOfzROQBEZkJjBCRP4vIUm8Qloejc0RNzFFVm2xqMhPQFddNwjHe+1dxXSNUVHYq0Mt7PQzXjxK47kIyvNdp3r/XA09EfLbsPW7wlFdwPVueB+wGjsL96JobEUsr798g8BkwwHu/Fmjjve6I6+4gHddL6ifA+d4yBS4tXRewnANX+2l+H3ubmsZkVwqmKVqjqvO913NxieIgXjfjxwGvich84FmgdBCTr4CJInIL7gu8Jt5RVcUllK2qukhVw8CSiO1fKiLf4Prw6YcbBbC8IcBn6noLLQZexg20A1CC6wkXXOLZB4wXkQtx/eMYc9hC1RcxptGJ7DCtBKio+iiAG8DlmPILVHWsiAzDje423+uUrqbbDJfbfhgIiUg34G5giKru9KqVEitYT0X96Jfap147gqoWi8hQXG+ilwO34boRN+aw2JWCiUnqBiFaIyKXQNlA6Ud7r3uo6kxV/R2wDdev/R4g5TA22QI3SM4uEWnHwQPIRK57JnCyiLTxxha/Avi8/Mq8K51UVZ0C/BSoSeIyplp2pWBi2VXA0yJyHxCHaxdYADwkIr1wv9qnevPWA/d4VU1/OtQNqeoCEZmHq05ajauiKjUOeF9ENqvqKSJyL24cAQGmqGpFYwikAG+LSKJX7q5DjcmYitgtqcYYY8pY9ZExxpgyVn1kmjwReRI3tnOkx1X1eT/iMaYhs+ojY4wxZaz6yBhjTBlLCsYYY8pYUjDGGFPGkoIxxpgy/x9BLPKoNKZu+gAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#调整max_depth和min_child_weight之后再次调整n_estimators(6,4)\n",
    "xgb2_3 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=699,  #数值大没关系，cv会自动返回合适的n_estimators\n",
    "        max_depth=6,\n",
    "        min_child_weight=3,\n",
    "        gamma=0,\n",
    "        subsample=0.5,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel=0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)\n",
    "\n",
    "modelfit(xgb2_3, X_train_part, y_train_part, cv_folds = kfold)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "# from sklearn.model_selection import cross_val_score\n",
    "# results = cross_val_score(xgb2_3, X_train, y_train, metrics='mlogloss', cv=kfold)\n",
    "# print (results)\n",
    "# print(\"CV logloss: %.2f%% (%.2f%%)\" % (results.mean()*100, results.std()*100))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:1: FutureWarning: from_csv is deprecated. Please use read_csv(...) instead. Note that some of the default arguments are different, so please refer to the documentation for from_csv when changing your function calls\n",
      "  \"\"\"Entry point for launching an IPython kernel.\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 600x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "cvresult = pd.DataFrame.from_csv('my_preds4_2_3_699.csv')\n",
    "\n",
    "cvresult = cvresult.iloc[100:]\n",
    "# plot\n",
    "test_means = cvresult['test-mlogloss-mean']\n",
    "test_stds = cvresult['test-mlogloss-std'] \n",
    "        \n",
    "train_means = cvresult['train-mlogloss-mean']\n",
    "train_stds = cvresult['train-mlogloss-std'] \n",
    "\n",
    "x_axis = range(100,cvresult.shape[0]+100)\n",
    "        \n",
    "fig = pyplot.figure(figsize=(6, 6), dpi=100)\n",
    "pyplot.errorbar(x_axis, test_means, yerr=test_stds ,label='Test')\n",
    "pyplot.errorbar(x_axis, train_means, yerr=train_stds ,label='Train')\n",
    "pyplot.title(\"XGBoost n_estimators vs Log Loss\")\n",
    "pyplot.xlabel( 'n_estimators' )\n",
    "pyplot.ylabel( 'Log Loss' )\n",
    "pyplot.savefig( 'n_estimators_detail4_2_3_699.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "当前参数调整得到的n_estimators最优值为103。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
